package com.ecommerce.user.util;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;

/**
 * 密码加密工具类
 * 提供密码的加密和验证功能，使用BCrypt加密算法
 */
@Component
public class PasswordEncoder {

    private final BCryptPasswordEncoder encoder;

    /**
     * 构造函数，初始化BCryptPasswordEncoder
     */
    public PasswordEncoder() {
        this.encoder = new BCryptPasswordEncoder();
    }

    /**
     * 加密原始密码
     *
     * @param rawPassword 原始密码
     * @return 加密后的密码
     */
    public String encode(String rawPassword) {
        if (rawPassword == null || rawPassword.trim().isEmpty()) {
            throw new IllegalArgumentException("密码不能为空");
        }
        return encoder.encode(rawPassword);
    }

    /**
     * 验证密码是否匹配
     *
     * @param rawPassword     原始密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    public boolean matches(String rawPassword, String encodedPassword) {
        if (rawPassword == null || encodedPassword == null) {
            return false;
        }
        return encoder.matches(rawPassword, encodedPassword);
    }

    /**
     * 获取BCryptPasswordEncoder实例
     *
     * @return BCryptPasswordEncoder实例
     */
    public BCryptPasswordEncoder getEncoder() {
        return encoder;
    }

    /**
     * 检查密码是否需要重新加密（当BCrypt强度升级时）
     *
     * @param encodedPassword 加密后的密码
     * @return 是否需要重新加密
     */
    public boolean upgradeEncoding(String encodedPassword) {
        return encoder.upgradeEncoding(encodedPassword);
    }

    /**
     * 验证密码强度
     *
     * @param password 密码
     * @return 密码强度级别（1-5，5为最强）
     */
    public int checkPasswordStrength(String password) {
        if (password == null || password.length() < 6) {
            return 1;
        }

        int score = 0;

        // 长度检查
        if (password.length() >= 8) score++;
        if (password.length() >= 12) score++;

        // 字符类型检查
        if (password.matches(".*[a-z].*")) score++;
        if (password.matches(".*[A-Z].*")) score++;
        if (password.matches(".*[0-9].*")) score++;
        if (password.matches(".*[^a-zA-Z0-9].*")) score++;

        // 限制最高分为5
        return Math.min(score, 5);
    }
}